package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.FonteDeRecursoDAO;
import br.com.duosoftware.orcamento.daos.PrevisaoFinanceiraDAO;
import br.com.duosoftware.orcamento.entidades.Acao;
import br.com.duosoftware.orcamento.entidades.FonteDeRecurso;
import br.com.duosoftware.orcamento.entidades.PrevisaoFinanceira;
import br.com.duosoftware.orcamento.utils.ManagedBeanUtil;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 *
 */
@ManagedBean
@ViewScoped
public class PrevisaoFinanceiraBean implements Serializable {

    private PrevisaoFinanceira previsaoFinanceira;
    private List<PrevisaoFinanceira> previsoesFinanceira;
    private PrevisaoFinanceiraDAO previsaoFinanceiraDAO;
    //SelectItens
    private List<SelectItem> fontesDeRecursos;
    //
    private AcaoBean acaoBean;

    public PrevisaoFinanceiraBean() {

        previsaoFinanceiraDAO = new PrevisaoFinanceiraDAO();

        acaoBean = (AcaoBean) ManagedBeanUtil.getContextInfo("#{acaoBean}");

    }

    public PrevisaoFinanceira getPrevisaoFinanceira() {
        return previsaoFinanceira;
    }

    public void setPrevisaoFinanceira(PrevisaoFinanceira previsaoFinanceira) {
        this.previsaoFinanceira = previsaoFinanceira;
    }

    public List<PrevisaoFinanceira> getPrevisoesFinanceira() {
        return previsoesFinanceira;
    }

    public void setPrevisoesFinanceira(List<PrevisaoFinanceira> previsoesFinanceira) {
        this.previsoesFinanceira = previsoesFinanceira;
    }

    public void buscarPrevisoesPorAcao() {

        Acao acao = acaoBean.getAcao();

        if (acao != null && acao.getId() != null) {

            previsoesFinanceira = previsaoFinanceiraDAO
                    .listarPrevisoesFinanceiras(acao);

        } else {

            previsoesFinanceira = null;

        }

    }

    /**
     * <b>Método que inicializa a previsaoFinanceira a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        Acao acao = acaoBean.getAcao();

        if (acao != null) {
            
            previsaoFinanceira = new PrevisaoFinanceira();
            previsaoFinanceira.setAcao(acao);
            
            RequestContext.getCurrentInstance().execute("dlgPrevisaoFinanceira.show()");
            
        } else {
         
            Mensagens.mensagemDeAlerta("Selecione uma ação",
                    "Selecione uma ação");
            
        }

    }

    /**
     * <b>Método que adiciona ou edita uma PrevisaoFinanceira</b><p>
     *
     * Após o término o método fecha o dialog de cadastro.
     * <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        previsaoFinanceiraDAO.salvarOuAtualizar(previsaoFinanceira);
        previsaoFinanceira = new PrevisaoFinanceira();
        previsoesFinanceira = null;

        buscarPrevisoesPorAcao();
        
        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPrevisaoFinanceira.hide()");
        requestContext.update("formPrevisoesFinanceira:dtPrevisoesFinanceira");

    }

    /**
     * <b>Método para iniciar o processo de edição de um PrevisaoFinanceira.</b>
     * <p>
     *
     * Ele verifica se há um PrevisaoFinanceira selecionada para edição, se não
     * houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PrevisaoFinanceira selecionado o médoto abre o dialog para
     * edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (previsaoFinanceira == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgPrevisaoFinanceira.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um
     * PrevisaoFinanceira.</b>
     * <p>
     *
     * Ele verifica se há uma PrevisaoFinanceira selecionado para exclusão, se
     * não houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PrevisaoFinanceira selecionado o médoto abre um p:dialog
     * para confirma ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (previsaoFinanceira == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirPrevisaoFinanceira.show()");
        }

    }

    /**
     * <b>Método para excluir um PrevisaoFinanceira.</b>
     * <p>
     *
     * Ele verifica se a PrevisaoFinanceira selecionado para exclusão está sendo
     * utilizado por alguma outra tabela do banco. Se estiver uma mensagem de
     * aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            previsaoFinanceiraDAO.excluir(previsaoFinanceira);
            previsaoFinanceira = new PrevisaoFinanceira();
            previsoesFinanceira = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirPrevisaoFinanceira.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b>
     * <p>
     *
     * O método instancia um novo objeto na variável PrevisaoFinanceira para
     * limpar as infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        previsaoFinanceira = new PrevisaoFinanceira();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPrevisaoFinanceira.hide()");
        requestContext.update("formPrevisaoFinanceira:dtPrevisoesFinanceira");

    }

    //get's do SelectItem
    public List<SelectItem> getFontesDeRecursos() {

        fontesDeRecursos = new LinkedList<SelectItem>();

        List<FonteDeRecurso> frs = new FonteDeRecursoDAO()
                .listarFontesDeRecurso();

        if (frs != null) {

            for (FonteDeRecurso f : frs) {

                fontesDeRecursos.add(new SelectItem(f, f.toString()));

            }

        }

        return fontesDeRecursos;
    }

}
